﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using BidFunLib.DAO;
using BidFunLib.Entity;
using NHibernate;
using BidFunLib.BidWeb;
using BidFunLib.EntityHelper;

namespace BidFunLib.Services
{
    /// <summary>
    /// 
    /// </summary>
    public class StatsBidUserGlobalManager
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(StatsBidUserGlobalManager));

        /// <summary>
        /// The dao of this manager
        /// </summary>
        private StatsBidUserGlobalDAO dao = new StatsBidUserGlobalDAO();
        
        /// <summary>
        /// Singleton instance
        /// </summary>
        private static StatsBidUserGlobalManager instance;

        /// <summary>
        /// Retreive singleton of this class
        /// </summary>
        public static StatsBidUserGlobalManager Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new StatsBidUserGlobalManager();
                }
                return StatsBidUserGlobalManager.instance;
            }
            set
            {
                StatsBidUserGlobalManager.instance = value;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        private StatsBidUserGlobalManager()
        {
        }

            /// <summary>
        /// Update statitics for one user on one sale to the object level (aggregation of all bid on the same object)
        /// Receive all users statistics for a specific bid sale.
        /// 
        /// </summary>
        /// <param name="statsBidSaleList"></param>
        public void calculateStatsBidUserGlobal(BidSale bidSale, Dictionary<Int32, StatsBidUserByBidSale> mapStatsBidUserByBidSale)
        {
            StatsBidUserGlobal statsBidUserGlobal = null;

            if (bidSale != null && mapStatsBidUserByBidSale != null)
            {
                foreach (StatsBidUserByBidSale statsBidUserByBidSale in mapStatsBidUserByBidSale.Values)
                {
                    statsBidUserGlobal = dao.getStatsBidUserGlobalById(statsBidUserByBidSale.IdBidUser);
                    if (statsBidUserGlobal == null)
                    {
                        statsBidUserGlobal = new StatsBidUserGlobal();
                        statsBidUserGlobal.IdStatsBidUserGlobal = -1;
                        statsBidUserGlobal.IdBidUser = statsBidUserByBidSale.IdBidUser;
                        statsBidUserGlobal.MinNbBids = 100000000;
                        statsBidUserGlobal.MinNbBidsByBot = 100000000;
                        statsBidUserGlobal.MinNbBidsManual = 100000000;
                    }

                    // concantenation of statistics
                    statsBidUserGlobal.NbBidSalesParticipation++;

                    statsBidUserGlobal.NbBidsByBot += statsBidUserByBidSale.NbBidsByBot;
                    statsBidUserGlobal.MeanNbBidsByBot = statsBidUserGlobal.NbBidsByBot / statsBidUserGlobal.NbBidSalesParticipation;
                    if (statsBidUserByBidSale.NbBidsByBot > statsBidUserGlobal.MaxNbBidsByBot)
                    {
                        statsBidUserGlobal.MaxNbBidsByBot = statsBidUserByBidSale.NbBidsByBot;
                    }
                    if (statsBidUserByBidSale.NbBidsByBot < statsBidUserGlobal.MinNbBidsByBot)
                    {
                        statsBidUserGlobal.MinNbBidsByBot = statsBidUserByBidSale.NbBidsByBot;
                    }

                    statsBidUserGlobal.NbBidsManual += statsBidUserByBidSale.NbBidsManual;
                    statsBidUserGlobal.MeanNbBidsManual = statsBidUserGlobal.NbBidsManual / statsBidUserGlobal.NbBidSalesParticipation;
                    if (statsBidUserByBidSale.NbBidsManual > statsBidUserGlobal.MaxNbBidsManual)
                    {
                        statsBidUserGlobal.MaxNbBidsManual = statsBidUserByBidSale.NbBidsManual;
                    }
                    if (statsBidUserByBidSale.NbBidsManual < statsBidUserGlobal.MinNbBidsManual)
                    {
                        statsBidUserGlobal.MinNbBidsManual = statsBidUserByBidSale.NbBidsManual;
                    }

                    statsBidUserGlobal.NbBids += statsBidUserByBidSale.NbBids;
                    statsBidUserGlobal.MeanNbBids = statsBidUserGlobal.NbBids / statsBidUserGlobal.NbBidSalesParticipation;
                    if (statsBidUserByBidSale.NbBids > statsBidUserGlobal.MaxNbBids)
                    {
                        statsBidUserGlobal.MaxNbBids = statsBidUserByBidSale.NbBids;
                    }
                    if (statsBidUserByBidSale.NbBids < statsBidUserGlobal.MinNbBids)
                    {
                        statsBidUserGlobal.MinNbBids = statsBidUserByBidSale.NbBids;
                    }


                    if (statsBidUserByBidSale.Winner)
                    {
                        statsBidUserGlobal.NbBidsWon++;
                    }

                    saveOrUpdate(statsBidUserGlobal);
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="bidLogger"></param>
        /// <returns></returns>
        public StatsBidUserGlobal saveOrUpdate(StatsBidUserGlobal statsBidUserGlobal)
        {
            return dao.saveOrUpdate(statsBidUserGlobal);
        }


    }
}
